﻿// --- START OF FILE Program.cs.txt ---

using config;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;

namespace DmExcel
{
    class Program
    {
        /// <summary>
        /// 直接启动该程序，根据提示输入Excel文件绝对路径地址
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // --- 2. 在程序启动时，检查并创建 result 目录 ---
            try
            {
                Directory.CreateDirectory("./result");
            }
            catch (Exception ex)
            {
                // 处理极端情况，如权限不足导致目录创建失败
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("警告：无法创建 'result' 输出目录。请检查程序所在文件夹的写入权限。");
                Console.WriteLine($"错误详情: {ex.Message}");
                Console.ResetColor();
                Console.WriteLine("按任意键退出...");
                Console.ReadKey();
                return; // 无法创建目录，则直接退出程序
            }
            // --------------------------------------------------

            while (true)
            {
                Console.WriteLine(new string('-', 75));
                Console.WriteLine("请输入以下首字母选择对应功能：");
                Console.WriteLine("  E[xport]:导出本程序目录的SQL文件查询结果到Excel");
                Console.WriteLine("  I[mport]:导入指定Excel文件到DM数据库(sheet名作为数据库目标表名自动创建,区分大小写)");
                Console.WriteLine("  L[oad]:快速载入指定Excel文件到数据库(仅支持windows，且表结构已创建)");
                Console.WriteLine("  S[et]:设置数据库连接信息等配置");
                Console.WriteLine("  Q[uit]:退出程序");

                string selected = Console.ReadKey().KeyChar.ToString().ToUpper();
                Console.WriteLine($"\n您选择了：【{selected}】");
                switch (selected)
                {
                    case "E":
                        Export(); break;
                    case "I":
                        Import(); break;
                    case "L":
                        Load(); break;
                    case "S":
                        SetConf(); break;
                    case "Q": return;
                    default:
                        continue;
                }
            }
        }

        private static void SetConf()
        {
            Console.Write("请输入【数据库主机】：");
            string db_host = Console.ReadLine();
            Console.Write("请输入【数据库端口】：");
            string db_port = Console.ReadLine();
            Console.Write("请输入【数据库用户】：");
            string db_user = Console.ReadLine();
            Console.Write("请输入【数据库密码】：");
            string db_password = Console.ReadLine();

            Cfg.Db_Host = db_host;
            Cfg.Db_Port = db_port;
            Cfg.Db_User = db_user;
            Cfg.Db_Password = db_password;
            Console.WriteLine(Cfg.Save());
        }

        private static void Export()
        {
            Console.WriteLine($"\n{new string('-', 30)}开始导出{new string('-', 30)}");
            if (Excel.GetServerFromExcel() is DataTable dataTable && dataTable.Rows.Count > 0)
            {
                // 新增：当存在servers.xlsx时，询问用户导出模式
                Console.WriteLine("检测到 `servers.xlsx` 文件，请选择导出模式：");
                Console.WriteLine("  (M)ultiple: 为每个数据库分别导出文件 (默认)");
                Console.WriteLine("  (S)ingle File, Separate Sheets: 将所有结果导出到单个Excel文件的不同Sheet中");
                Console.WriteLine("  (C)ombine into Single Sheet: 将所有数据库对同一SQL的查询结果合并到同一个Sheet中");
                Console.Write("请输入您的选择 [M/S/C]: ");
                string exportMode = Console.ReadKey().KeyChar.ToString().ToUpper();
                Console.WriteLine();

                switch (exportMode)
                {
                    case "S":
                        // --- 逻辑：导出到单个文件，每个库的查询结果是独立的Sheet ---
                        var allSheetsForSingleFile = new Dictionary<string, object>();
                        Console.WriteLine("\n开始合并导出到单个文件（不同Sheet）...");
                        foreach (DataRow row in dataTable.Rows)
                        {
                            Cfg.Db_Name = row["db_name"].ToString();
                            Cfg.Db_Host = row["db_host"].ToString();
                            Cfg.Db_Port = row["db_port"].ToString();
                            Cfg.Db_User = row["db_user"].ToString();
                            Cfg.Db_Password = row["db_password"].ToString();
                            Console.WriteLine($"正在从【{Cfg.Db_Name}】数据库收集数据...");

                            var serverData = Excel.GetDataForCurrentConfig();
                            foreach (var sheet in serverData)
                            {
                                string uniqueSheetName = $"{Cfg.Db_Name}-{sheet.Key}";
                                allSheetsForSingleFile.Add(uniqueSheetName, sheet.Value);
                            }
                        }

                        if (allSheetsForSingleFile.Count > 0)
                        {
                            string outputFileName = $"./result/Separate_Sheets_Export_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
                            MiniExcelLibs.MiniExcel.SaveAs(outputFileName, allSheetsForSingleFile);
                            Console.WriteLine($"\n所有数据已成功导出到文件：{outputFileName}");
                        }
                        else
                        {
                            Console.WriteLine("\n没有查询到任何数据可供导出。");
                        }
                        break;

                    case "C":
                        // --- 新增逻辑：将所有数据库对同一SQL的查询结果合并到同一个Sheet中 ---
                        Console.WriteLine("\n开始将所有数据库结果合并到同一Sheet中...");
                        Excel.ExportCombinedToSingleSheet(dataTable);
                        break;

                    default: // "M" 或其他任意键
                        // --- 原始逻辑：为每个服务器导出单独的文件 ---
                        Console.WriteLine("\n开始为每个数据库分别导出文件...");
                        foreach (DataRow row in dataTable.Rows)
                        {
                            Cfg.Db_Name = row["db_name"].ToString();
                            Cfg.Db_Host = row["db_host"].ToString();
                            Cfg.Db_Port = row["db_port"].ToString();
                            Cfg.Db_User = row["db_user"].ToString();
                            Cfg.Db_Password = row["db_password"].ToString();
                            if (Excel.SaveToExcel())
                            {
                                Console.WriteLine($"\n【{Cfg.Db_Name}】导出成功！");
                            }
                        }
                        break;
                }
            }
            else
            {
                // 如果没有servers.xlsx，则保持原有行为
                if (Excel.SaveToExcel())
                {
                    Console.WriteLine("\n导出成功！");
                }
                else
                {
                    Console.WriteLine("\n导出失败！");
                }
            }
            Console.WriteLine($"\n{new string('-', 30)}导出完成{new string('-', 30)}");
        }

        static void Import()
        {
            Console.Write("\n请输入将要导入的Excel文件路径(仅支持xlsx): ");
            string excel_path = Console.ReadLine();
            if (Excel.ImportToDB(excel_path.Trim()))
            {
                Console.WriteLine("\n导入成功！");
            }
            else
            {
                Console.WriteLine("\n导入完成，但可能有错误，请核查！");
            }
        }
        private static void Load()
        {
            Console.WriteLine("\n请输入要载入的Excel文件路径（仅支持windows平台，且PATH环境变量已经配置达梦数据库bin目录）：");
            Excel.LoadToDB(Console.ReadLine());
        }
    }
}